const HotKeyApp = require('./HotKeyApp');
const { expect } = require('chai');
const SlidingWindow = require('./SlidingWindow');
const CacheHolder = require('./CacheHolder');
const KeyListener = require('./KeyListener');
const { ConsolePusher } = require('./Pusher');

// 这是一个基础的测试文件，使用Mocha和Chai进行测试
// 运行前请安装依赖：npm install --save-dev mocha chai

describe('滑动窗口测试', function() {
  it('应该正确检测热点', function() {
    const slidingWindow = new SlidingWindow(2, 20);
    
    // 添加19个计数，还未达到阈值
    expect(slidingWindow.addCount(19)).to.be.false;
    
    // 再添加1个计数，达到阈值
    expect(slidingWindow.addCount(1)).to.be.true;
  });
  
  it('应该正确清除过期窗口', function() {
    const slidingWindow = new SlidingWindow(0.1, 10); // 100ms一个窗口
    
    // 添加5个计数
    expect(slidingWindow.addCount(5)).to.be.false;
    
    // 等待超过一个窗口期
    return new Promise((resolve) => {
      setTimeout(() => {
        // 旧窗口应该被清除，从头开始计数
        expect(slidingWindow.addCount(5)).to.be.false;
        expect(slidingWindow.addCount(5)).to.be.true; // 达到阈值
        resolve();
      }, 200);
    });
  });
});

describe('缓存测试', function() {
  it('应该能够添加和获取缓存', function() {
    const cache = CacheHolder.getCache('testApp');
    cache.set('testKey', 'testValue');
    expect(cache.get('testKey')).to.equal('testValue');
  });
  
  it('应该能够清除缓存', function() {
    const cache = CacheHolder.getCache('testApp');
    cache.set('testKey', 'testValue');
    cache.del('testKey');
    expect(cache.get('testKey')).to.be.undefined;
  });
});

describe('热键监听器测试', function() {
  it('应该能够检测热键', function() {
    const keyListener = new KeyListener();
    
    // 创建一个收集推送的测试推送器
    const testPusher = {
      pushedKeys: [],
      push(hotKeyModel) {
        this.pushedKeys.push(hotKeyModel);
      },
      remove(hotKeyModel) {
        // 忽略删除操作
      }
    };
    
    keyListener.setPushers([testPusher]);
    
    // 发送低于阈值的热键
    const model = {
      key: 'testKey',
      appName: 'testApp',
      keyType: 'string',
      count: 5
    };
    
    keyListener.newKey(model, 'CLIENT');
    expect(testPusher.pushedKeys.length).to.equal(0); // 没有推送
    
    // 发送超过阈值的热键（默认阈值为10）
    model.count = 100;
    keyListener.newKey(model, 'CLIENT');
    expect(testPusher.pushedKeys.length).to.equal(1); // 产生推送
    expect(testPusher.pushedKeys[0].key).to.equal('testKey');
  });
});
